// @const
const UNIQUE_ID_KEY = "_!?Ort7%iD.lEI_K}d3?,_UniqueId";

/**
 * 自定义协程, 模拟 Unity 的协程
 */
export default class MyCoroutine {
    /**
     * 生成器数组, key = 协程 Id, val = 生成器
     */
    private static _oGenMap: Map<string, Generator<any>> = new Map();

    /**
     * 序列号
     */
    private static _nSN: number = 0;

    /**
     * 类默认构造器
     */
    private constructor() {
    }

    /**
     * 启动协程, 并返回协程 Id
     * 
     * @param oGen 生成器
     * @return 协程 Id
     */
    public static startCoroutine(oGen: Generator<any>): string {
        if (null == oGen) {
            return null;
        }

        ++MyCoroutine._nSN;
        let strUniqueId = MyCoroutine._nSN.toString();

        oGen[UNIQUE_ID_KEY] = strUniqueId;
        MyCoroutine._oGenMap.set(strUniqueId, oGen);

        return strUniqueId;
    }

    /**
     * 停止协程
     * 
     * @param strUniqueId 协程 Id
     */
    public static stopCoroutine(strUniqueId: string): void {
        if (null != strUniqueId) {
            MyCoroutine._oGenMap.delete(strUniqueId);
        }
    }

    /**
     * 执行所有协程
     */
    public static execALL(): void {
        MyCoroutine._oGenMap.forEach((oGen) => {
            if (null == oGen) {
                return;
            }

            // 执行下一步
            let xResult: any = oGen.next();

            if (null == xResult || 
                xResult["done"]) {
                // 如果已经执行完成, 
                // 则停止协程...
                MyCoroutine.stopCoroutine(oGen[UNIQUE_ID_KEY]);
            }
        });
    }
}
